<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.4"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Flow: net_flow/options.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">Flow<span id="projectnumber">&#160;2.0.0</span>
   </div>
   <div id="projectbrief">Flow project: Full implementation reference.</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.4 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div id="nav-path" class="navpath">
  <ul>
<li class="navelem"><a class="el" href="dir_460afd45d0ec637b1427e0e06a6fbcf7.html">net_flow</a></li>  </ul>
</div>
</div><!-- top -->
<div class="header">
  <div class="headertitle"><div class="title">options.cpp</div></div>
</div><!--header-->
<div class="contents">
<a href="options_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno">    1</span><span class="comment">/* Flow</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno">    2</span><span class="comment"> * Copyright 2023 Akamai Technologies, Inc.</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno">    3</span><span class="comment"> *</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno">    4</span><span class="comment"> * Licensed under the Apache License, Version 2.0 (the</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno">    5</span><span class="comment"> * &quot;License&quot;); you may not use this file except in</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno">    6</span><span class="comment"> * compliance with the License.  You may obtain a copy</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno">    7</span><span class="comment"> * of the License at</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno">    8</span><span class="comment"> *</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno">    9</span><span class="comment"> *   https://www.apache.org/licenses/LICENSE-2.0</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno">   10</span><span class="comment"> *</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno">   11</span><span class="comment"> * Unless required by applicable law or agreed to in</span></div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno">   12</span><span class="comment"> * writing, software distributed under the License is</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno">   13</span><span class="comment"> * distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno">   14</span><span class="comment"> * CONDITIONS OF ANY KIND, either express or implied.</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno">   15</span><span class="comment"> * See the License for the specific language governing</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno">   16</span><span class="comment"> * permissions and limitations under the License. */</span></div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno">   17</span><span class="comment"></span> </div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno">   18</span><span class="comment">/// @file</span></div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno">   19</span><span class="comment"></span><span class="preprocessor">#include &quot;<a class="code" href="options_8hpp.html">flow/net_flow/options.hpp</a>&quot;</span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno">   20</span><span class="preprocessor">#include &quot;<a class="code" href="cong__ctl_8hpp.html">flow/net_flow/detail/cong_ctl.hpp</a>&quot;</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno">   21</span><span class="preprocessor">#include &lt;boost/algorithm/string.hpp&gt;</span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno">   22</span> </div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno">   23</span><span class="comment">// Internal macros (#undef at the end of file).</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno">   24</span><span class="comment"></span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno">   25</span><span class="comment">/// @cond</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno">   26</span><span class="comment"></span><span class="comment">/* -^- Doxygen, please ignore the following.  (Don&#39;t want docs generated for temp macro; this is more maintainable</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno">   27</span><span class="comment"> * than specifying the macro name to omit it, in Doxygen-config EXCLUDE_SYMBOLS.) */</span></div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno">   28</span> </div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno">   29</span><span class="preprocessor">#define ADD_CONFIG_OPTION(ARG_opt, ARG_desc) \</span></div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno">   30</span><span class="preprocessor">  Node_options::add_config_option(opts_desc, #ARG_opt, &amp;target-&gt;ARG_opt, defaults_source.ARG_opt, ARG_desc, \</span></div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno">   31</span><span class="preprocessor">                                  printout_only)</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno">   32</span> </div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno">   33</span><span class="comment">// -v- Doxygen, please stop ignoring.</span><span class="comment"></span></div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno">   34</span><span class="comment">/// @endcond</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno">   35</span><span class="comment"></span> </div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno">   36</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceflow_1_1net__flow.html">flow::net_flow</a></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno">   37</span>{</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno">   38</span> </div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno">   39</span><span class="comment">// Implementations.</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno">   40</span> </div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Node__options.html#a5e19fc9671473ace300d457f7334dc31">   41</a></span><a class="code hl_function" href="structflow_1_1net__flow_1_1Node__options.html#a5e19fc9671473ace300d457f7334dc31">Node_options::Node_options</a>() :</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno">   42</span>  <span class="comment">// They definitely need to opt into this.</span></div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno">   43</span>  m_st_capture_interrupt_signals_internally(false),</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno">   44</span>  <span class="comment">/* OS is under no obligation to take this literally and will probably impose its own limit which</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno">   45</span><span class="comment">   * may be smaller than this.  In Linux 2.6.x I&#39;ve observed the limit can&#39;t go higher than somewhere</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno">   46</span><span class="comment">   * between 1MB and 2MB.  Anyway, we pick a reasonable value and hope it has some effect. */</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno">   47</span>  m_st_low_lvl_max_buf_size(3 * 1024 * 1024),</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno">   48</span>  <span class="comment">// Let the code pick something reasonable based on platform, hopefully.</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno">   49</span>  m_st_timer_min_period(0),</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno">   50</span>  <span class="comment">// Allow unlimited # of packets per loop iteration for now.</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno">   51</span>  m_dyn_max_packets_per_main_loop_iteration(0),</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno">   52</span>  <span class="comment">// default max_block_size + a SMALL overhead.</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno">   53</span>  m_dyn_low_lvl_max_packet_size(1124),</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno">   54</span>  <span class="comment">// This default is explained in the option description (as of this writing): it&#39;s faster.</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno">   55</span>  m_dyn_guarantee_one_low_lvl_in_buf_per_socket(true)</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno">   56</span>{</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno">   57</span>  <span class="comment">// Nothing.</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno">   58</span>}</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno">   59</span> </div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno">   60</span><span class="keyword">template</span>&lt;<span class="keyword">typename</span> Opt_type&gt;</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Node__options.html#aa27ce9852b67581b0171b716289bea60">   61</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Node__options.html#aa27ce9852b67581b0171b716289bea60">Node_options::add_config_option</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Node__options.html#af93781c0e8136a82e41080701719d996">Options_description</a>* opts_desc,</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno">   62</span>                                     <span class="keyword">const</span> std::string&amp; opt_id,</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno">   63</span>                                     Opt_type* target_val, <span class="keyword">const</span> Opt_type&amp; default_val,</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno">   64</span>                                     <span class="keyword">const</span> <span class="keywordtype">char</span>* description, <span class="keywordtype">bool</span> printout_only) <span class="comment">// Static.</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno">   65</span>{</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno">   66</span>  <span class="keyword">using </span>boost::program_options::value;</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno">   67</span>  <span class="keywordflow">if</span> (printout_only)</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno">   68</span>  {</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno">   69</span>    opts_desc-&gt;add_options()</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno">   70</span>      (<a class="code hl_function" href="structflow_1_1net__flow_1_1Node__options.html#aacfe6175ac39447c107413853e578459">opt_id_to_str</a>(opt_id).c_str(), value&lt;Opt_type&gt;()-&gt;default_value(default_val));</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno">   71</span>  }</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno">   72</span>  <span class="keywordflow">else</span></div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno">   73</span>  {</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno">   74</span>    opts_desc-&gt;add_options()</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno">   75</span>      (<a class="code hl_function" href="structflow_1_1net__flow_1_1Node__options.html#aacfe6175ac39447c107413853e578459">opt_id_to_str</a>(opt_id).c_str(), value&lt;Opt_type&gt;(target_val)-&gt;default_value(default_val),</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno">   76</span>       description);</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno">   77</span>  }</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno">   78</span>}</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno">   79</span> </div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Node__options.html#a07d18f7e934d079835f5367fbf7d6d1b">   80</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Node__options.html#a07d18f7e934d079835f5367fbf7d6d1b">Node_options::setup_config_parsing_helper</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Node__options.html#af93781c0e8136a82e41080701719d996">Options_description</a>* opts_desc,</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno">   81</span>                                               <a class="code hl_struct" href="structflow_1_1net__flow_1_1Node__options.html">Node_options</a>* target,</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno">   82</span>                                               <span class="keyword">const</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Node__options.html">Node_options</a>&amp; defaults_source,</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno">   83</span>                                               <span class="keywordtype">bool</span> printout_only) <span class="comment">// Static.</span></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno">   84</span>{</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno">   85</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno">   86</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Node__options.html#aea7861f3c7739f8e588293d16a2de447">m_st_capture_interrupt_signals_internally</a>,</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno">   87</span>     <span class="stringliteral">&quot;If and only if this is true, the Node will detect SIGINT and SIGTERM (or your OS&#39;s version thereof); &quot;</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno">   88</span>       <span class="stringliteral">&quot;upon seeing such a signal, it will fire Node::interrupt_all_waits(), which will interrupt all &quot;</span></div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno">   89</span>       <span class="stringliteral">&quot;blocking operations, conceptually similarly to POSIX&#39;s EINTR. If this is true, the user may register &quot;</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno">   90</span>       <span class="stringliteral">&quot;their own signal handler(s) (for any purpose whatsoever) using boost::asio::signal_set. However, behavior &quot;</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno">   91</span>       <span class="stringliteral">&quot;is undefined if the program registers signal handlers via any other API, such as sigaction() or signal().  &quot;</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno">   92</span>       <span class="stringliteral">&quot;If you need to set up such a non-signal_set signal handler, AND you require EINTR-like behavior, &quot;</span></div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno">   93</span>       <span class="stringliteral">&quot;then (1) set this option to false; (2) trap SIGINT and SIGTERM yourself; (3) in your handlers for the &quot;</span></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno">   94</span>       <span class="stringliteral">&quot;latter, simply call Node::interrupt_all_waits(). Similarly, if you want custom behavior regarding &quot;</span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno">   95</span>       <span class="stringliteral">&quot;Node::interrupt_all_waits(), feel free to call it whenever you want (not necessarily even from a signal &quot;</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno">   96</span>       <span class="stringliteral">&quot;handler), and set this to false. However, if a typical, common-sense behavior is what you&#39;re after -- and &quot;</span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno">   97</span>       <span class="stringliteral">&quot;either don&#39;t need additional signal handling or are OK with using signal_set for it -- then setting this to &quot;</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno">   98</span>       <span class="stringliteral">&quot;true is a good option.&quot;</span>);</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno">   99</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno">  100</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Node__options.html#a78baaf1a911c8d490a13278422307e8a">m_st_low_lvl_max_buf_size</a>,</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno">  101</span>     <span class="stringliteral">&quot;The max size to ask the OS to set our UDP socket&#39;s receive buffer to in order to minimize loss &quot;</span></div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno">  102</span>       <span class="stringliteral">&quot;if we can&#39;t process datagrams fast enough.  This should be as high as possible while being &quot;</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno">  103</span>       <span class="stringliteral">&quot;\&quot;acceptable\&quot; in terms of memory.  However, the OS will probably have its own limit and may well &quot;</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno">  104</span>       <span class="stringliteral">&quot;pick a limit that is the minimum of that limit and this value.&quot;</span>);</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno">  105</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno">  106</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Node__options.html#abef8889be34024b07eff3211a3213d5f">m_st_timer_min_period</a>,</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno">  107</span>     <span class="stringliteral">&quot;A time period such that the boost.asio timer implementation for this platform is able to &quot;</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno">  108</span>       <span class="stringliteral">&quot;accurately able to schedule events within this time period or greater.  If you select 0, the &quot;</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno">  109</span>       <span class="stringliteral">&quot;code will decide what this value based on the platform, but its logic for this may or may not &quot;</span></div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno">  110</span>       <span class="stringliteral">&quot;be correct (actually it will probably be correct but possibly too conservative [large], causing &quot;</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno">  111</span>       <span class="stringliteral">&quot;timer coarseness in mechanisms like packet pacing).&quot;</span>);</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno">  112</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno">  113</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Node__options.html#a99cb19cf77ac787103ac616f4415eaf9">m_dyn_max_packets_per_main_loop_iteration</a>,</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno">  114</span>     <span class="stringliteral">&quot;The UDP net-stack may deliver 2 or more datagrams to the Flow Node at the same time.  To lower overhead &quot;</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno">  115</span>       <span class="stringliteral">&quot;and increase efficiency, Flow will process all such datagrams -- and any more that may arrive during this &quot;</span></div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno">  116</span>       <span class="stringliteral">&quot;processing -- before preparing any resulting outgoing messages, such as acknowledgments or more data packets.  &quot;</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno">  117</span>       <span class="stringliteral">&quot;In high-speed conditions this may result in excessive burstiness of outgoing traffic.  This option&#39;s value &quot;</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno">  118</span>       <span class="stringliteral">&quot;places a limit on the number of datagrams to process before constructing and sending any resulting outgoing &quot;</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno">  119</span>       <span class="stringliteral">&quot;messages to prevent this burstiness.  If 0, there is no limit.&quot;</span>);</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno">  120</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno">  121</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Node__options.html#a88c732d10914f406cc43a2c20cc800c6">m_dyn_low_lvl_max_packet_size</a>,</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno">  122</span>     <span class="stringliteral">&quot;Any incoming low-level (UDP) packet will be truncated to this size.  This should be well above &quot;</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno">  123</span>       <span class="stringliteral">&quot;per-socket max-block-size (# of bytes of user payload per DATA packet).  There will only be one buffer &quot;</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno">  124</span>       <span class="stringliteral">&quot;of this size in memory at a time, so no need to be too stingy, but on the other hand certain &quot;</span></div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno">  125</span>       <span class="stringliteral">&quot;allocation/deallocation behavior may cause performance drops if this unnecessarily large.&quot;</span>);</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno">  126</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno">  127</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Node__options.html#ad041b807fddff912fd6f302abeb88a2f">m_dyn_guarantee_one_low_lvl_in_buf_per_socket</a>,</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno">  128</span>     <span class="stringliteral">&quot;This very inside-baseball setting controls the allocation/copy behavior of the UDP receive-deserialize &quot;</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno">  129</span>       <span class="stringliteral">&quot;operation sequence.  When enabled, there is exactly one input buffer large enough to &quot;</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno">  130</span>       <span class="stringliteral">&quot;hold any one serialized incoming packet; any deserialized data (including DATA and ACK payloads) are &quot;</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno">  131</span>       <span class="stringliteral">&quot;stored in separately allocated per-packet buffers; and and the input buffer is repeatedly reused &quot;</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno">  132</span>       <span class="stringliteral">&quot;without reallocation.  When disabled, however, at least some packet types (most notably DATA) will &quot;</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno">  133</span>       <span class="stringliteral">&quot;use the zero-copy principle, having the deserializer take ownership of the input buffer and access pieces &quot;</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno">  134</span>       <span class="stringliteral">&quot;inside it as post-deserialization values (most notably the DATA payload); in this case the input buffer &quot;</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno">  135</span>       <span class="stringliteral">&quot;has to be reallocated between UDP reads.  As of this writing the former behavior seems to be somewhat &quot;</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno">  136</span>       <span class="stringliteral">&quot;faster, especially if low-lvl-max-packet-size is unnecessarily large; but arguably the zero-copy behavior &quot;</span></div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno">  137</span>       <span class="stringliteral">&quot;may become faster if some implementation details related to this change.  So this switch seemed worth &quot;</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno">  138</span>       <span class="stringliteral">&quot;keeping.&quot;</span>);</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno">  139</span> </div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno">  140</span>  <a class="code hl_function" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad0015d953f3079a326ba6dce5d0bff89">Peer_socket_options::setup_config_parsing_helper</a>(opts_desc,</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno">  141</span>                                                   &amp;target-&gt;<a class="code hl_variable" href="structflow_1_1net__flow_1_1Node__options.html#a71b56a75a4b6dba57daeef79b0b880f7">m_dyn_sock_opts</a>,</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno">  142</span>                                                   defaults_source.<a class="code hl_variable" href="structflow_1_1net__flow_1_1Node__options.html#a71b56a75a4b6dba57daeef79b0b880f7">m_dyn_sock_opts</a>,</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno">  143</span>                                                   printout_only);</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno">  144</span>} <span class="comment">// Node_options::setup_config_parsing_helper()</span></div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno">  145</span> </div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Node__options.html#a5819e60ed58aafb496e39962c89215f1">  146</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Node__options.html#a5819e60ed58aafb496e39962c89215f1">Node_options::setup_config_parsing</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Node__options.html#af93781c0e8136a82e41080701719d996">Options_description</a>* opts_desc)</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno">  147</span>{</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno">  148</span>  <span class="comment">// Set up *opts_desc to parse into *this when the caller chooses to.  Take defaults from *this.</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno">  149</span>  <a class="code hl_function" href="structflow_1_1net__flow_1_1Node__options.html#a07d18f7e934d079835f5367fbf7d6d1b">setup_config_parsing_helper</a>(opts_desc, <span class="keyword">this</span>, *<span class="keyword">this</span>, <span class="keyword">false</span>);</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno">  150</span>} <span class="comment">// Node_options::setup_config_parsing()</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno">  151</span> </div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Node__options.html#a6a3a56f6379c0d5b075bc35f078f9e3d">  152</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceflow_1_1net__flow.html#ab9f537c84f77e9b8fa742fc5dc6d5693">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Node__options.html">Node_options</a>&amp; opts)</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno">  153</span>{</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno">  154</span>  <a class="code hl_struct" href="structflow_1_1net__flow_1_1Node__options.html">Node_options</a> sink;</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno">  155</span>  <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Node__options.html#af93781c0e8136a82e41080701719d996">Node_options::Options_description</a> opts_desc(<span class="stringliteral">&quot;Per-net_flow::Node option values&quot;</span>);</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno">  156</span>  <a class="code hl_function" href="structflow_1_1net__flow_1_1Node__options.html#a07d18f7e934d079835f5367fbf7d6d1b">Node_options::setup_config_parsing_helper</a>(&amp;opts_desc, &amp;sink, opts, <span class="keyword">true</span>);</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno">  157</span>  <span class="keywordflow">return</span> os &lt;&lt; opts_desc;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno">  158</span>}</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno">  159</span> </div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Node__options.html#aacfe6175ac39447c107413853e578459">  160</a></span>std::string <a class="code hl_function" href="structflow_1_1net__flow_1_1Node__options.html#aacfe6175ac39447c107413853e578459">Node_options::opt_id_to_str</a>(<span class="keyword">const</span> std::string&amp; opt_id) <span class="comment">// Static.</span></div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno">  161</span>{</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno">  162</span>  <span class="keyword">using </span>boost::algorithm::starts_with;</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno">  163</span>  <span class="keyword">using </span>boost::algorithm::replace_all;</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno">  164</span>  <span class="keyword">using </span>std::string;</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno">  165</span> </div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno">  166</span>  <span class="keyword">const</span> <span class="keywordtype">string</span> STATIC_PREFIX = <span class="stringliteral">&quot;m_st_&quot;</span>;</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno">  167</span>  <span class="keyword">const</span> <span class="keywordtype">string</span> DYNAMIC_PREFIX = <span class="stringliteral">&quot;m_dyn_&quot;</span>;</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno">  168</span> </div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno">  169</span>  <span class="keywordtype">string</span> str = opt_id;</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno">  170</span>  <span class="keywordflow">if</span> (starts_with(opt_id, STATIC_PREFIX))</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno">  171</span>  {</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno">  172</span>    str.erase(0, STATIC_PREFIX.size());</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno">  173</span>  }</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno">  174</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (starts_with(opt_id, DYNAMIC_PREFIX))</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno">  175</span>  {</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno">  176</span>    str.erase(0, DYNAMIC_PREFIX.size());</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno">  177</span>  }</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno">  178</span> </div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno">  179</span>  replace_all(str, <span class="stringliteral">&quot;_&quot;</span>, <span class="stringliteral">&quot;-&quot;</span>);</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno">  180</span> </div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno">  181</span>  <span class="keywordflow">return</span> str;</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno">  182</span>}</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno">  183</span> </div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ac31b91c6f8c7b0d7a4e29fd218e5f9dc">  184</a></span><a class="code hl_function" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ac31b91c6f8c7b0d7a4e29fd218e5f9dc">Peer_socket_options::Peer_socket_options</a>() :</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno">  185</span>  <span class="comment">/* Should be a safe UDP datagram size.  @todo Not a totally solid statement... plus it&#39;s too low;</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno">  186</span><span class="comment">   * increasing to ~1500 increases throughput hugely.  Choosing it dynamically is a @todo elsewhere</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno">  187</span><span class="comment">   * in the code. */</span></div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno">  188</span>  m_st_max_block_size(1024),</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno">  189</span>  <span class="comment">// Initial value recommended by RFC 6298 is 1 sec but seems too conservative.  @todo Decide.</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno">  190</span>  m_st_connect_retransmit_period(boost::chrono::milliseconds(125)),</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno">  191</span>  <span class="comment">// @todo.</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno">  192</span>  m_st_connect_retransmit_timeout(boost::chrono::seconds(3)),</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno">  193</span>  <span class="comment">/* @todo Reconsider.  See also to-do in class Node doc header.</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno">  194</span><span class="comment">   * WARNING!  If you change this, ensure s_st_max_cong_wnd_blocks is still sufficiently small. */</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno">  195</span>  m_st_snd_buf_max_size(6 * 1024 * 1024),</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno">  196</span>  <span class="comment">// @todo Ditto.</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno">  197</span>  m_st_rcv_buf_max_size(m_st_snd_buf_max_size),</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno">  198</span>  <span class="comment">// Disabling flow control is an emergency measure only.</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno">  199</span>  m_st_rcv_flow_control_on(true),</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno">  200</span>  <span class="comment">// Seems reasonable.  Should be a few hundred KB typically.</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno">  201</span>  m_st_rcv_buf_max_size_slack_percent(10),</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno">  202</span>  <span class="comment">/* The value 50% is taken from BSD implementation (Stevens/Wright, TCP/IP Illustrated Vol. 2,</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno">  203</span><span class="comment">   * 1995), although it&#39;s barely discussed there.  It does make sense though; it should give the</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno">  204</span><span class="comment">   * sender a large window to work with but also leave some time to allow our application layer to</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno">  205</span><span class="comment">   * read off more bytes from Receive buffer after advertising the window at this mark. */</span></div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno">  206</span>  m_st_rcv_buf_max_size_to_advertise_percent(50),</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno">  207</span>  <span class="comment">/* This allows for about 2.2 Received_packet struct per maximally large packet in</span></div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno">  208</span><span class="comment">   * m_rcv_packets_with_gaps.  So it&#39;s something like 10-20 bytes per 1k of DATA, or about 2-4%</span></div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno">  209</span><span class="comment">   * overhead.  So it&#39;s conservative in terms of memory use.  For any reasonably large max Receive</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno">  210</span><span class="comment">   * buffer size, it&#39;s also at least 100 packets.  If 100 packets arrive numbering higher than</span></div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno">  211</span><span class="comment">   * unreceived packet P, it&#39;s a VERY good bet P will never arrive.  Thus it&#39;s also conservative in</span></div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno">  212</span><span class="comment">   * terms of loss.  Finally, since this formula allows enough space to hold an entire</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno">  213</span><span class="comment">   * m_rcv_syn_rcvd_data_q&#39;s worth of queued up packets, it won&#39;t throw away any queued up</span></div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno">  214</span><span class="comment">   * packets in SYN_RCVD state. */</span></div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno">  215</span>  m_st_rcv_max_packets_after_unrecvd_packet_ratio_percent(220),</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno">  216</span>  <span class="comment">// Satisfies RFC 5681 (500 ms max); taken from BSD implementation (Stevens/Wright, TCP/IP Illustrated Vol. 2, 1995).</span></div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno">  217</span>  m_st_delayed_ack_timer_period(boost::chrono::milliseconds(200)),</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno">  218</span>  <span class="comment">// Per RFC 5681.</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno">  219</span>  m_st_max_full_blocks_before_ack_send(2),</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno">  220</span>  m_st_rexmit_on(true),</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno">  221</span>  <span class="comment">// @todo Experiment and look at RFCs.</span></div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno">  222</span>  m_st_max_rexmissions_per_packet(15),</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno">  223</span>  <span class="comment">// @todo Experiment.  RFC 6298 recommends this value.</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno">  224</span>  m_st_init_drop_timeout(boost::chrono::seconds(1)),</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno">  225</span>  <span class="comment">// @todo Experiment.  Choosing less aggressive values for now, except for m_st_drop_all_on_drop_timeout.</span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno">  226</span>  m_st_drop_packet_exactly_after_drop_timeout(false),</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno">  227</span>  <span class="comment">// Consistent with RFC 4341, but see discussion where it&#39;s used.</span></div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno">  228</span>  m_st_drop_all_on_drop_timeout(true),</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno">  229</span>  <span class="comment">// @todo Experiment.  Choosing less aggressive values for now, except for m_st_drop_all_on_drop_timeout.</span></div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno">  230</span>  m_st_out_of_order_ack_restarts_drop_timer(true),</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno">  231</span>  <span class="comment">// @todo Experiment.</span></div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno">  232</span>  m_st_snd_pacing_enabled(true),</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno">  233</span>  <span class="comment">/* Value taken from Linux&#39;s westwood.c which was written by the creators of Westwood+ bandwidth</span></div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno">  234</span><span class="comment">   * estimation algorithm themselves. 50 msec seems like a reasonable line in the sand between</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno">  235</span><span class="comment">   * &quot;small RTT&quot; and &quot;medium RTT.&quot; */</span></div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno">  236</span>  m_st_snd_bandwidth_est_sample_period_floor(boost::chrono::milliseconds(50)),</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno">  237</span>  <span class="comment">// Pass in a non-existent strategy ID, which will cause our operator&lt;&lt;() to choose what it considers the default.</span></div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno">  238</span>  m_st_cong_ctl_strategy(boost::lexical_cast&lt;<a class="code hl_enumeration" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a42ce94dbc5d8be28134261c2eb18b245">Congestion_control_strategy_choice</a>&gt;(<span class="stringliteral">&quot;none&quot;</span>)),</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno">  239</span>  <span class="comment">// Let code choose initial CWND using RFC 5681 method.</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno">  240</span>  m_st_cong_ctl_init_cong_wnd_blocks(0),</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno">  241</span>  <span class="comment">/* See the constraints in the doc header for this constant.  That said, here are the calculations I</span></div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno">  242</span><span class="comment">   * used to get 640:</span></div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno">  243</span><span class="comment">   *</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno">  244</span><span class="comment">   * this option = B * RTT / max-block-size = 100 Mbits/sec * 50 msec * 1/1024 blocks/byte = 100</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno">  245</span><span class="comment">   * Mbits/sec * 50 msec * 1/1000 sec/msec * 1/8 Mbytes/Mbits * 1024*1024 bytes/Mbytes / 1024 bytes</span></div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno">  246</span><span class="comment">   * = (100*50/1000/8*1024*1024/1024) blocks = 640 blocks.  (Note the units cancel out properly.)</span></div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno">  247</span><span class="comment">   *</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno">  248</span><span class="comment">   * Receive buffer is currently 6 Mbytes.  6 Mbytes / 640 blocks = 6 * 1024 * 1024 / (640 * 1024),</span></div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno">  249</span><span class="comment">   * which is a Receive buffer-to-CWND ratio of 9.6s.</span></div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno">  250</span><span class="comment">   *</span></div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno">  251</span><span class="comment">   * WARNING!  If you change this, ensure m_st_max_rcv_buf_size is still sufficiently large. */</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno">  252</span>  m_st_cong_ctl_max_cong_wnd_blocks(640),</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno">  253</span>  <span class="comment">// Per RFC 5681-3.1.</span></div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno">  254</span>  m_st_cong_ctl_cong_wnd_on_drop_timeout_blocks(1),</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno">  255</span>  <span class="comment">// Use RFC 5681 default (0 is special value).</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno">  256</span>  m_st_cong_ctl_cong_avoidance_increment_blocks(0),</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno">  257</span>  <span class="comment">// Use RFC 5681 default (0 is special value).</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno">  258</span>  m_st_cong_ctl_classic_wnd_decay_percent(0),</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno">  259</span>  <span class="comment">// The minimal allowed ceiling by RFC 6298.</span></div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno">  260</span>  m_dyn_drop_timeout_ceiling(boost::chrono::seconds(60)),</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno">  261</span>  <span class="comment">// RFC 6298 recommends this value.</span></div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno">  262</span>  m_dyn_drop_timeout_backoff_factor(2),</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno">  263</span>  <span class="comment">// This shouldn&#39;t be too bad.  @todo Though it should probably be based off DTO or something....</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno">  264</span>  m_dyn_rcv_wnd_recovery_timer_period(boost::chrono::seconds(1)),</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno">  265</span>  <span class="comment">// Seems OK.  After a minute it&#39;s probably a lost cause.</span></div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno">  266</span>  m_dyn_rcv_wnd_recovery_max_period(boost::chrono::minutes(1))</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno">  267</span>{</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno">  268</span>  <span class="comment">// Nothing.</span></div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno">  269</span>}</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno">  270</span> </div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad0015d953f3079a326ba6dce5d0bff89">  271</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad0015d953f3079a326ba6dce5d0bff89">Peer_socket_options::setup_config_parsing_helper</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad65db0c4fdf22bf5723dc3018174b4aa">Options_description</a>* opts_desc,</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno">  272</span>                                                      <a class="code hl_struct" href="structflow_1_1net__flow_1_1Peer__socket__options.html">Peer_socket_options</a>* target,</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno">  273</span>                                                      <span class="keyword">const</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Peer__socket__options.html">Peer_socket_options</a>&amp; defaults_source,</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno">  274</span>                                                      <span class="keywordtype">bool</span> printout_only) <span class="comment">// Static.</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno">  275</span>{</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno">  276</span>  <span class="keyword">using </span>std::vector;</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno">  277</span>  <span class="keyword">using </span>std::string;</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno">  278</span>  <span class="keyword">using </span>boost::algorithm::join;</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno">  279</span> </div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno">  280</span>  <span class="comment">// Build the comma-separated list of possible string values for enum m_st_cong_ctl_strategy, for help output.</span></div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno">  281</span>  vector&lt;string&gt; cong_strategy_ids;</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno">  282</span>  <a class="code hl_function" href="classflow_1_1net__flow_1_1Congestion__control__selector.html#aca9ae5272088f3ef8fb81f40cc85224c">Congestion_control_selector::get_ids</a>(&amp;cong_strategy_ids);</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno">  283</span>  <span class="keyword">const</span> <span class="keywordtype">string</span> str_cong_strategy_ids = join(cong_strategy_ids, <span class="stringliteral">&quot;, &quot;</span>);</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno">  284</span> </div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno">  285</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno">  286</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#aeaaf832a38a5e334789e81e214686ea7">m_st_max_block_size</a>,</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno">  287</span>     <span class="stringliteral">&quot;The size of block that we will strive to (and will, assuming at least that many bytes are &quot;</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno">  288</span>       <span class="stringliteral">&quot;available in Send buffer) pack into each outgoing DATA packet.  It is assumed the other side is &quot;</span></div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno">  289</span>       <span class="stringliteral">&quot;following the same policy (any packets that do not -- i.e., exceed this size -- are dropped). &quot;</span></div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno">  290</span>       <span class="stringliteral">&quot;This is an important control; the higher it is the better for performance AS LONG AS it&#39;s not so &quot;</span></div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno">  291</span>       <span class="stringliteral">&quot;high it undergoes IP fragmentation (or does that even happen in UDP? if not, even worse -- &quot;</span></div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno">  292</span>       <span class="stringliteral">&quot;it&#39;ll just be dropped and not sent!).  The performance impact is major; e.g., assuming no &quot;</span></div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno">  293</span>       <span class="stringliteral">&quot;fragmentation/dropping, we&#39;ve seen a ~1500 byte MBS result in 20-30% higher throughput than &quot;</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno">  294</span>       <span class="stringliteral">&quot;1024 byte MBS.  &quot;</span></div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno">  295</span>       <span class="stringliteral">&quot;Additionally, if using net_flow module with no reliability feature -- i.e., if you want to perform FEC &quot;</span></div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno">  296</span>       <span class="stringliteral">&quot;or something else outside the Flow protocol -- then it is absolutely essential that EVERY send*() call &quot;</span></div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno">  297</span>       <span class="stringliteral">&quot;provides a buffer whose size is a multiple of max-block-size.  Otherwise packet boundaries &quot;</span></div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno">  298</span>       <span class="stringliteral">&quot;will not be what you expect, and you will get what seems to be corrupted data at the &quot;</span></div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno">  299</span>       <span class="stringliteral">&quot;application layer (since our stream-based API has no way of knowing where your message begins &quot;</span></div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno">  300</span>       <span class="stringliteral">&quot;or ends).  Alternatively you can encode message terminators or packet sizes, but since in &quot;</span></div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno">  301</span>       <span class="stringliteral">&quot;unreliable mode integrity of a given block is guaranteed only if all blocks align with &quot;</span></div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno">  302</span>       <span class="stringliteral">&quot;max-block-size boundaries, you&#39;ll still probably be screwed.&quot;</span>);</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno">  303</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno">  304</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a8f18c8222ade5f99b83a85e0203ff130">m_st_connect_retransmit_period</a>,</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno">  305</span>     <span class="stringliteral">&quot;How often to resend SYN or SYN_ACK while SYN_ACK or SYN_ACK_ACK, respectively, has not been received.  &quot;</span></div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno">  306</span>       <span class="stringliteral">&quot;In other words, this controls the pause between retries during the connection opening phase, by either side, &quot;</span></div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno">  307</span>       <span class="stringliteral">&quot;if the other side is not responding with the appropriate response.  &quot;</span></div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno">  308</span>       <span class="stringliteral">&quot;Examples: \&quot;250 ms\&quot;, \&quot;1 s\&quot;.&quot;</span>);</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno">  309</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno">  310</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ac75171c4f1086d0aa38248ae5ffba884">m_st_connect_retransmit_timeout</a>,</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno">  311</span>     <span class="stringliteral">&quot;How long from the first SYN or SYN_ACK to allow for connection handshake before aborting connection.  &quot;</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno">  312</span>       <span class="stringliteral">&quot;Examples: \&quot;5500 ms\&quot;, \&quot;60 seconds\&quot;.&quot;</span>);</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno">  313</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno">  314</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a8ca6086022691700f5e5d2dc87ca92fd">m_st_snd_buf_max_size</a>,</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno">  315</span>     <span class="stringliteral">&quot;Maximum number of bytes that the Send buffer can hold.  This determines how many bytes user can &quot;</span></div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno">  316</span>       <span class="stringliteral">&quot;send() while peer cannot send over network until send() refuses to take any more bytes.  Note &quot;</span></div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno">  317</span>       <span class="stringliteral">&quot;that any value given will be increased, if necessary, to the nearest multiple of &quot;</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno">  318</span>       <span class="stringliteral">&quot;max-block-size.  This is important to preserve message boundaries when operating in &quot;</span></div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno">  319</span>       <span class="stringliteral">&quot;unreliable mode (guaranteed max-block-size-sized chunks of data will be sent out in their &quot;</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno">  320</span>       <span class="stringliteral">&quot;entirety instead of being fragmented).&quot;</span>);</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno">  321</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno">  322</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a171480324f26432928738532cb3c8556">m_st_rcv_buf_max_size</a>,</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno">  323</span>     <span class="stringliteral">&quot;Maximum number of bytes that the Receive buffer can hold.  This determines how many bytes &quot;</span></div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno">  324</span>       <span class="stringliteral">&quot;can be received in the background by the Node without user doing any receive()s.  &quot;</span></div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno">  325</span>       <span class="stringliteral">&quot;It is also rounded up to to the nearest multiple of max-block-size.&quot;</span>);</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno">  326</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno">  327</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad9a31f63eea6f89952a89ea0385d9a2e">m_st_rcv_flow_control_on</a>,</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno">  328</span>     <span class="stringliteral">&quot;Whether flow control (a/k/a receive window a/k/a rcv_wnd management) is enabled.  If this is &quot;</span></div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno">  329</span>       <span class="stringliteral">&quot;disabled, an infinite rcv_wnd will always be advertised to the sender; so if the Receive buffer &quot;</span></div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno">  330</span>       <span class="stringliteral">&quot;is exceeded packets are dropped as normal, but the sender will not know it should stop sending &quot;</span></div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno">  331</span>       <span class="stringliteral">&quot;until Receive buffer space is freed.  If this is enabled, we keep the sender informed of how &quot;</span></div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno">  332</span>       <span class="stringliteral">&quot;much Receive buffer space is available, so it can suspend the flow as necessary.&quot;</span>);</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno">  333</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno">  334</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#aa6d16c98186187fdffadcfb853d58410">m_st_rcv_buf_max_size_slack_percent</a>,</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno">  335</span>     <span class="stringliteral">&quot;% of rcv-buf-max-size such that if Receive buffer stores up to (100 + this many) % of &quot;</span></div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno">  336</span>       <span class="stringliteral">&quot;rcv-buf-max-size bytes, the bytes will still be accepted.  In other words, this allows the max &quot;</span></div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno">  337</span>       <span class="stringliteral">&quot;Receive buffer to hold slightly more than rcv-buf-max-size bytes.  However, the current Receive &quot;</span></div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno">  338</span>       <span class="stringliteral">&quot;buffer capacity advertised to the other side of the connection will be based on the &quot;</span></div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno">  339</span>       <span class="stringliteral">&quot;non-inflated rcv-buf-max-size.  This option provides some protection against the fact that the &quot;</span></div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno">  340</span>       <span class="stringliteral">&quot;receive window value sent to the other side will lag behind reality somewhat.&quot;</span>);</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno">  341</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno">  342</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#af483d0292f363e7dbf14dc7a2dd49f3f">m_st_rcv_buf_max_size_to_advertise_percent</a>,</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno">  343</span>     <span class="stringliteral">&quot;% of rcv-buf-max-size that has to be freed, since the last receive window advertisement, via &quot;</span></div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno">  344</span>       <span class="stringliteral">&quot;user popping data from Receive buffer, before we must send a receive window advertisement.  &quot;</span></div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno">  345</span>       <span class="stringliteral">&quot;Normally we send rcv_wnd to the other side opportunistically in every ACK; but there can be &quot;</span></div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno">  346</span>       <span class="stringliteral">&quot;situations when there is no packets to acknowledge, and hence we must specifically make a &quot;</span></div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno">  347</span>       <span class="stringliteral">&quot;packet just to send over rcv_wnd.  Typically we should only need to do this if the buffer was &quot;</span></div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno">  348</span>       <span class="stringliteral">&quot;exceeded and is now significantly freed.  This value must be in [1, 100], but anything over 50 &quot;</span></div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno">  349</span>       <span class="stringliteral">&quot;is probably pushing it.&quot;</span>);</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno">  350</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno">  351</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#af78ca6cf3c6da3bc24cea40d522f0bdb">m_st_rcv_max_packets_after_unrecvd_packet_ratio_percent</a>,</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno">  352</span>     <span class="stringliteral">&quot;The limit on the size of Peer_socket::m_rcv_packets_with_gaps, expressed as what percentage the &quot;</span></div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno">  353</span>       <span class="stringliteral">&quot;maximal size of that structure times max-block-size is of the maximal Receive buffer size.  For &quot;</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno">  354</span>       <span class="stringliteral">&quot;example, if this is 200, then Peer_socket::m_rcv_packets_with_gaps can represent up to roughly &quot;</span></div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno">  355</span>       <span class="stringliteral">&quot;2x as many full-sized blocks as the Receive buffer can.  This should also by far exceed any &quot;</span></div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno">  356</span>       <span class="stringliteral">&quot;sender congestion window max size to avoid packet loss.  m_rcv_packets_with_gaps consists of all packets &quot;</span></div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno">  357</span>       <span class="stringliteral">&quot;such that at least one packet sequentially preceding them has not yet been received.&quot;</span>);</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno">  358</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno">  359</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#add7ccb9e8cd0715ca78e0710d2a6db06">m_st_delayed_ack_timer_period</a>,</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno">  360</span>     <span class="stringliteral">&quot;The maximum amount of time to delay sending ACK with individual packet&#39;s acknowledgment since &quot;</span></div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno">  361</span>       <span class="stringliteral">&quot;receiving that individual packet.  If set to zero duration, any given individual acknowledgment &quot;</span></div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno">  362</span>       <span class="stringliteral">&quot;is sent within a non-blocking amount of time of its DATA packet being read.  Inspired by RFC &quot;</span></div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno">  363</span>       <span class="stringliteral">&quot;1122-4.2.3.2.  Examples: \&quot;200 ms\&quot;, \&quot;550200 microseconds\&quot;.&quot;</span>);</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno">  364</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno">  365</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad7a76f7ae03e258b30b04c7350481de6">m_st_max_full_blocks_before_ack_send</a>,</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno">  366</span>     <span class="stringliteral">&quot;If there are at least this many TIMES max-block-size bytes&#39; worth of individual acknowledgments &quot;</span></div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno">  367</span>       <span class="stringliteral">&quot;to be sent, then the delayed ACK timer is to be short-circuited, and the accumulated &quot;</span></div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno">  368</span>       <span class="stringliteral">&quot;acknowledgments are to be sent as soon as possible.  Inspired by RFC 5681.&quot;</span>);</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno">  369</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno">  370</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a6c35e6014182ccfcbee6bed4571a8360">m_st_rexmit_on</a>,</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno">  371</span>     <span class="stringliteral">&quot;Whether to enable reliability via retransmission.  If false, a detected lost packet may have &quot;</span></div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno">  372</span>       <span class="stringliteral">&quot;implications on congestion control (speed at which further data are sent) but will not cause &quot;</span></div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno">  373</span>       <span class="stringliteral">&quot;that packet to be resent; receiver application code either has to be OK with missing packets or &quot;</span></div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno">  374</span>       <span class="stringliteral">&quot;must implement its own reliability (e.g., FEC).  Packets may also be delivered in an order &quot;</span></div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno">  375</span>       <span class="stringliteral">&quot;different from the way they were sent.  If true, the receiver need not worry about it, as any &quot;</span></div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno">  376</span>       <span class="stringliteral">&quot;lost packets will be retransmitted with no participation from the application code on either &quot;</span></div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno">  377</span>       <span class="stringliteral">&quot;side, as in TCP.  Also as in TCP, this adds order preservation, so that the stream of bytes sent &quot;</span></div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno">  378</span>       <span class="stringliteral">&quot;will be exactly equal to the stream of bytes received. Retransmission removes the requirement &quot;</span></div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno">  379</span>       <span class="stringliteral">&quot;for the very exacting block-based way in which send() and friends must be called.  &quot;</span></div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno">  380</span>       <span class="stringliteral">&quot;This option must have the same value on both sides of the connection, or the server will refuse  &quot;</span></div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno">  381</span>       <span class="stringliteral">&quot;the connection.&quot;</span>);</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno">  382</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno">  383</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a0b37da87848d01220c7e58f90e6764ba">m_st_max_rexmissions_per_packet</a>,</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno">  384</span>     <span class="stringliteral">&quot;If retransmission is enabled and a given packet is retransmitted this many times and has to be &quot;</span></div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno">  385</span>       <span class="stringliteral">&quot;retransmitted yet again, the connection is reset.  Should be positive.&quot;</span>);</div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno">  386</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno">  387</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a02afb5ed4201d83c87a3a30fcbdda489">m_st_init_drop_timeout</a>,</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno">  388</span>     <span class="stringliteral">&quot;Once socket enters ESTABLISHED state, this is the value for m_snd_drop_timeout before the first RTT &quot;</span></div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno">  389</span>       <span class="stringliteral">&quot;measurement is made (the first valid acknowledgment arrives).  Example: \&quot;2 seconds\&quot;.&quot;</span>);</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno">  390</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno">  391</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a638ca4ecd9d8bfc8710bda71687c4ea3">m_st_drop_packet_exactly_after_drop_timeout</a>,</div>
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno">  392</span>     <span class="stringliteral">&quot;If true, when scheduling Drop Timer, schedule it for Drop Timeout relative to the send time of &quot;</span></div>
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno">  393</span>       <span class="stringliteral">&quot;the earliest In-flight packet at the time.  If false, also schedule DTO relative to the time of &quot;</span></div>
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno">  394</span>       <span class="stringliteral">&quot;scheduling.  The latter is less aggressive and is recommended by RFC 6298.&quot;</span>);</div>
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno">  395</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno">  396</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ac6f4da1892e2157e60772ed74298b2b2">m_st_drop_all_on_drop_timeout</a>,</div>
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno">  397</span>     <span class="stringliteral">&quot;If true, when the Drop Timer fires, all In-flight packets are to be considered Dropped (and &quot;</span></div>
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno">  398</span>       <span class="stringliteral">&quot;thus the timer is to be disabled).  If false, only the earliest In-flight packet is to be &quot;</span></div>
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno">  399</span>       <span class="stringliteral">&quot;considered Dropped (and thus the timer is to restart).  RFC 6298 recommends false.  true is more aggressive.&quot;</span>);</div>
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno">  400</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno">  401</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ae7d5eb1b4e37317478c3b25bc3c8c245">m_st_out_of_order_ack_restarts_drop_timer</a>,</div>
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno">  402</span>     <span class="stringliteral">&quot;If an In-flight packet is acknowledged, but it is not the earliest In-flight packet (i.e., it&#39;s &quot;</span></div>
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno">  403</span>       <span class="stringliteral">&quot;an out-of-order acknowledgment), and this is true, the timer is restarted.  Otherwise the timer &quot;</span></div>
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno">  404</span>       <span class="stringliteral">&quot;continues to run.  The former is less aggressive.  RFC 6298 wording is ambiguous on what it &quot;</span></div>
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno">  405</span>       <span class="stringliteral">&quot;recommends (not clear if cumulative ACK only, or if SACK also qualifies).&quot;</span>);</div>
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno">  406</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno">  407</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a2a3d420992e19e5addb7193d607e82e4">m_st_snd_bandwidth_est_sample_period_floor</a>,</div>
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno">  408</span>     <span class="stringliteral">&quot;When estimating the available send bandwidth, each sample must be compiled over at least this long &quot;</span></div>
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno">  409</span>       <span class="stringliteral">&quot;of a time period, even if the SRTT is lower.  Normally a sample is collected over at least an SRTT, but &quot;</span></div>
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno">  410</span>       <span class="stringliteral">&quot;computing a bandwidth sample over a quite short time period can produce funky results, hence this floor.  &quot;</span></div>
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno">  411</span>       <span class="stringliteral">&quot;Send bandwidth estimation is used at least for some forms of congestion control.&quot;</span>);</div>
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno">  412</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno">  413</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad7cbcdd64a4366740ff9e55b39c977ba">m_st_snd_pacing_enabled</a>,</div>
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno">  414</span>     <span class="stringliteral">&quot;Enables or disables packet pacing, which attempts to spread out, without sacrificing overall &quot;</span></div>
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno">  415</span>       <span class="stringliteral">&quot;send throughput, outgoing low-level packets to prevent loss.  If disabled, any packet that is &quot;</span></div>
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno">  416</span>       <span class="stringliteral">&quot;allowed by congestion/flow control to be sent over the wire is immediately sent to the UDP &quot;</span></div>
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno">  417</span>       <span class="stringliteral">&quot;net-stack; so for example if 200 packets are ready to send and are allowed to be sent, they&#39;re sent &quot;</span></div>
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno">  418</span>       <span class="stringliteral">&quot;at the same time.  If enabled, they will be spread out over a reasonable time period instead.  &quot;</span></div>
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno">  419</span>       <span class="stringliteral">&quot;Excessive burstiness can lead to major packet drops, so this can really help.&quot;</span>);</div>
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno">  420</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno">  421</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#aca69056d3029193823f0c0ae630f5759">m_st_cong_ctl_strategy</a>,</div>
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno">  422</span>     (<span class="keywordtype">string</span>(<span class="stringliteral">&quot;The congestion control algorithm to use for the connection or connections.  The choices are: [&quot;</span>) +</div>
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno">  423</span>      str_cong_strategy_ids + <span class="stringliteral">&quot;].&quot;</span>).c_str());</div>
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno">  424</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno">  425</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a637811d19d4a2b4d9b3ab79742aadff8">m_st_cong_ctl_init_cong_wnd_blocks</a>,</div>
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno">  426</span>     <span class="stringliteral">&quot;The initial size of the congestion window, given in units of max-block-size-sized blocks.  &quot;</span></div>
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno">  427</span>       <span class="stringliteral">&quot;The special value 0 means RFC 5681&#39;s automatic max-block-size-based computation should &quot;</span></div>
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno">  428</span>       <span class="stringliteral">&quot;be used instead.&quot;</span>);</div>
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno">  429</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno">  430</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a1bdc21e84373dd96494a76f11603335e">m_st_cong_ctl_max_cong_wnd_blocks</a>,</div>
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno">  431</span>     <span class="stringliteral">&quot;The constant that determines the CWND limit in congestion_window_at_limit() and &quot;</span></div>
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno">  432</span>       <span class="stringliteral">&quot;clamp_congestion_window() (in multiple of max-block-size).  When choosing this value, use these &quot;</span></div>
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno">  433</span>       <span class="stringliteral">&quot;constraints: &quot;</span></div>
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno">  434</span>       <span class="stringliteral">&quot;(1) This limits total outgoing throughput.  The throughput B will be &lt;= CWND/RTT, where RTT is &quot;</span></div>
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno">  435</span>       <span class="stringliteral">&quot;roughly the RTT of the connection, and CWND == S_MAX_CONG_WND_BLOCKS * max-block-size.  &quot;</span></div>
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno">  436</span>       <span class="stringliteral">&quot;Therefore, choose B and RTT values and set S_MAX_CONG_WND_BLOCKS = B * RTT / max-block-size &quot;</span></div>
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno">  437</span>       <span class="stringliteral">&quot;(B in bytes/second, RTT in seconds).  &quot;</span></div>
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno">  438</span>       <span class="stringliteral">&quot;(2) Until we implement Receive window, this value should be much (say, 4x) less than the size &quot;</span></div>
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno">  439</span>       <span class="stringliteral">&quot;of the Receive buffer, to avoid situations where even a well-behaving user (i.e., user that &quot;</span></div>
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno">  440</span>       <span class="stringliteral">&quot;receive()s all data ASAP) cannot keep up with reading data off Receive buffer, forcing &quot;</span></div>
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno">  441</span>       <span class="stringliteral">&quot;net_flow to drop large swaths of incoming traffic.  If CWND is much smaller than Receive &quot;</span></div>
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno">  442</span>       <span class="stringliteral">&quot;buffer size, then this avoids that problem.&quot;</span>);</div>
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno">  443</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno">  444</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a2c8fcb08dfb0d1ebcc21e02940c149e8">m_st_cong_ctl_cong_wnd_on_drop_timeout_blocks</a>,</div>
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno">  445</span>     <span class="stringliteral">&quot;On Drop Timeout, set congestion window to this value times max-block-size.&quot;</span>);</div>
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno">  446</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno">  447</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a2a7ab1e27acd52d8fa3aadc9eb13d116">m_st_cong_ctl_cong_avoidance_increment_blocks</a>,</div>
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno">  448</span>     <span class="stringliteral">&quot;The multiple of max-block-size by which to increment CWND in congestion avoidance mode after receiving &quot;</span></div>
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno">  449</span>       <span class="stringliteral">&quot;at least a full CWND&#39;s worth of clean acknowledgments.  RFC 5681 (classic Reno) mandates this is set to 1, &quot;</span></div>
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno">  450</span>       <span class="stringliteral">&quot;but we allow it to be overridden.  The special value 0 causes the RFC value to be used.&quot;</span>);</div>
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno">  451</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno">  452</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#aeccfe97128c9f5f62ff26d73047dec2e">m_st_cong_ctl_classic_wnd_decay_percent</a>,</div>
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno">  453</span>     <span class="stringliteral">&quot;In classic congestion control, RFC 5681 specified the window should be halved on loss; this &quot;</span></div>
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno">  454</span>       <span class="stringliteral">&quot;option allows one to use a customer percentage instead.  This should be a value in [1, &quot;</span></div>
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno">  455</span>       <span class="stringliteral">&quot;100] to have the window decay to that percentage of its previous value, or 0 to use the RFC &quot;</span></div>
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno">  456</span>       <span class="stringliteral">&quot;5681-recommended constant (50).&quot;</span>);</div>
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno">  457</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno">  458</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ae2551f2995f5830e0461bec6fdd9035e">m_dyn_drop_timeout_backoff_factor</a>,</div>
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno">  459</span>     <span class="stringliteral">&quot;Whenever the Drop Timer fires, upon the requisite Dropping of packet(s), the DTO (Drop Timeout) &quot;</span></div>
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno">  460</span>       <span class="stringliteral">&quot;is set to its current value times this factor, and then the timer is rescheduled accordingly.  &quot;</span></div>
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno">  461</span>       <span class="stringliteral">&quot;RFC 6298 recommends 2.  Another value might be 1 (disable feature).  The lower the more &quot;</span></div>
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno">  462</span>       <span class="stringliteral">&quot;aggressive.&quot;</span>);</div>
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno">  463</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno">  464</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ac38c0bbba5edbb4964a3914ccf56018f">m_dyn_rcv_wnd_recovery_timer_period</a>,</div>
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno">  465</span>     <span class="stringliteral">&quot;When the mode triggered by rcv-buf-max-size-to-advertise-percent being exceeded is in effect, &quot;</span></div>
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno">  466</span>       <span class="stringliteral">&quot;to counteract the possibility of ACK loss the receive window is periodically advertised &quot;</span></div>
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno">  467</span>       <span class="stringliteral">&quot;subsequently -- with the period given by this option -- until either some new data arrive or &quot;</span></div>
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno">  468</span>       <span class="stringliteral">&quot;rcv-wnd-recovery-max-period is exceeded.  Example: \&quot;5 s\&quot;.&quot;</span>);</div>
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno">  469</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno">  470</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a371e3340cecf792f0fd815b55dd25f60">m_dyn_rcv_wnd_recovery_max_period</a>,</div>
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno">  471</span>     <span class="stringliteral">&quot;Approximate amount of time since the beginning of rcv_wnd recovery due to &quot;</span></div>
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno">  472</span>       <span class="stringliteral">&quot;rcv-buf-max-size-to-advertise-percent until we give up and end that phase.  Example: \&quot;30 s\&quot;.&quot;</span>);</div>
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno">  473</span>  ADD_CONFIG_OPTION</div>
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno">  474</span>    (<a class="code hl_variable" href="structflow_1_1net__flow_1_1Peer__socket__options.html#afd02a9d91ef5e5c13ea95ea35624da1a">m_dyn_drop_timeout_ceiling</a>,</div>
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno">  475</span>     <span class="stringliteral">&quot;Ceiling to impose on the Drop Timeout.  Example: \&quot;120 s\&quot;.&quot;</span>);</div>
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno">  476</span>} <span class="comment">// Peer_socket_options::setup_config_parsing_helper()</span></div>
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno">  477</span> </div>
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Peer__socket__options.html#aa6d94acf3c746c8f59c91ffa824ef8bd">  478</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="structflow_1_1net__flow_1_1Peer__socket__options.html#aa6d94acf3c746c8f59c91ffa824ef8bd">Peer_socket_options::setup_config_parsing</a>(<a class="code hl_typedef" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad65db0c4fdf22bf5723dc3018174b4aa">Options_description</a>* opts_desc)</div>
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno">  479</span>{</div>
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno">  480</span>  <span class="comment">// Set up *opts_desc to parse into *this when the caller chooses to.  Take defaults from *this.</span></div>
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno">  481</span>  <a class="code hl_function" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad0015d953f3079a326ba6dce5d0bff89">setup_config_parsing_helper</a>(opts_desc, <span class="keyword">this</span>, *<span class="keyword">this</span>, <span class="keyword">false</span>);</div>
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno">  482</span>} <span class="comment">// Node_options::setup_config_parsing()</span></div>
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno">  483</span> </div>
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"><a class="line" href="structflow_1_1net__flow_1_1Peer__socket__options.html#a3954beff8f73e2d6f566f4e15c30219c">  484</a></span>std::ostream&amp; <a class="code hl_function" href="namespaceflow_1_1net__flow.html#ab9f537c84f77e9b8fa742fc5dc6d5693">operator&lt;&lt;</a>(std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_struct" href="structflow_1_1net__flow_1_1Peer__socket__options.html">Peer_socket_options</a>&amp; opts)</div>
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno">  485</span>{</div>
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno">  486</span>  <a class="code hl_struct" href="structflow_1_1net__flow_1_1Peer__socket__options.html">Peer_socket_options</a> sink;</div>
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno">  487</span>  <a class="code hl_typedef" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad65db0c4fdf22bf5723dc3018174b4aa">Peer_socket_options::Options_description</a> opts_desc(<span class="stringliteral">&quot;Per-net_flow::Peer_socket option values&quot;</span>);</div>
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno">  488</span>  <a class="code hl_function" href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad0015d953f3079a326ba6dce5d0bff89">Peer_socket_options::setup_config_parsing_helper</a>(&amp;opts_desc, &amp;sink, opts, <span class="keyword">true</span>);</div>
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno">  489</span>  <span class="keywordflow">return</span> os &lt;&lt; opts_desc;</div>
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno">  490</span>}</div>
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno">  491</span> </div>
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno">  492</span><span class="preprocessor">#undef ADD_CONFIG_OPTION </span><span class="comment">// For cleanliness.</span></div>
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno">  493</span> </div>
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno">  494</span>} <span class="comment">// namespace flow::net_flow</span></div>
<div class="ttc" id="aclassflow_1_1net__flow_1_1Congestion__control__selector_html_aca9ae5272088f3ef8fb81f40cc85224c"><div class="ttname"><a href="classflow_1_1net__flow_1_1Congestion__control__selector.html#aca9ae5272088f3ef8fb81f40cc85224c">flow::net_flow::Congestion_control_selector::get_ids</a></div><div class="ttdeci">static void get_ids(std::vector&lt; std::string &gt; *ids)</div><div class="ttdoc">Returns a list of strings, called IDs, each of which textually represents a distinct Congestion_contr...</div><div class="ttdef"><b>Definition:</b> <a href="cong__ctl_8cpp_source.html#l00115">cong_ctl.cpp:115</a></div></div>
<div class="ttc" id="acong__ctl_8hpp_html"><div class="ttname"><a href="cong__ctl_8hpp.html">cong_ctl.hpp</a></div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_html"><div class="ttname"><a href="namespaceflow_1_1net__flow.html">flow::net_flow</a></div><div class="ttdoc">Flow module containing the API and implementation of the Flow network protocol, a TCP-inspired stream...</div><div class="ttdef"><b>Definition:</b> <a href="asio_2node_8cpp_source.html#l00024">node.cpp:25</a></div></div>
<div class="ttc" id="anamespaceflow_1_1net__flow_html_ab9f537c84f77e9b8fa742fc5dc6d5693"><div class="ttname"><a href="namespaceflow_1_1net__flow.html#ab9f537c84f77e9b8fa742fc5dc6d5693">flow::net_flow::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const Congestion_control_selector::Strategy_choice &amp;strategy_choice)</div><div class="ttdoc">Serializes a Peer_socket_options::Congestion_control_strategy_choice enum to a standard ostream – the...</div><div class="ttdef"><b>Definition:</b> <a href="cong__ctl_8cpp_source.html#l00146">cong_ctl.cpp:146</a></div></div>
<div class="ttc" id="aoptions_8hpp_html"><div class="ttname"><a href="options_8hpp.html">options.hpp</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html">flow::net_flow::Node_options</a></div><div class="ttdoc">A set of low-level options affecting a single Flow Node, including Peer_socket objects and other obje...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00448">options.hpp:449</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_a07d18f7e934d079835f5367fbf7d6d1b"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#a07d18f7e934d079835f5367fbf7d6d1b">flow::net_flow::Node_options::setup_config_parsing_helper</a></div><div class="ttdeci">static void setup_config_parsing_helper(Options_description *opts_desc, Node_options *target, const Node_options &amp;defaults_source, bool printout_only)</div><div class="ttdoc">Loads the full set of boost.program_options config options into the given Options_description,...</div><div class="ttdef"><b>Definition:</b> <a href="options_8cpp_source.html#l00080">options.cpp:80</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_a5819e60ed58aafb496e39962c89215f1"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#a5819e60ed58aafb496e39962c89215f1">flow::net_flow::Node_options::setup_config_parsing</a></div><div class="ttdeci">void setup_config_parsing(Options_description *opts_desc)</div><div class="ttdoc">Modifies a boost.program_options options description object to enable subsequent parsing of a command...</div><div class="ttdef"><b>Definition:</b> <a href="options_8cpp_source.html#l00146">options.cpp:146</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_a5e19fc9671473ace300d457f7334dc31"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#a5e19fc9671473ace300d457f7334dc31">flow::net_flow::Node_options::Node_options</a></div><div class="ttdeci">Node_options()</div><div class="ttdoc">Constructs a Node_options with values equal to those used by Node when the Node creator chooses not t...</div><div class="ttdef"><b>Definition:</b> <a href="options_8cpp_source.html#l00041">options.cpp:41</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_a71b56a75a4b6dba57daeef79b0b880f7"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#a71b56a75a4b6dba57daeef79b0b880f7">flow::net_flow::Node_options::m_dyn_sock_opts</a></div><div class="ttdeci">Peer_socket_options m_dyn_sock_opts</div><div class="ttdoc">The set of per-Peer_socket options in this per-Node set of options.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00580">options.hpp:580</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_a78baaf1a911c8d490a13278422307e8a"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#a78baaf1a911c8d490a13278422307e8a">flow::net_flow::Node_options::m_st_low_lvl_max_buf_size</a></div><div class="ttdeci">size_t m_st_low_lvl_max_buf_size</div><div class="ttdoc">The max size to ask the OS to set our UDP socket's receive buffer to in order to minimize loss if we ...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00525">options.hpp:525</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_a88c732d10914f406cc43a2c20cc800c6"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#a88c732d10914f406cc43a2c20cc800c6">flow::net_flow::Node_options::m_dyn_low_lvl_max_packet_size</a></div><div class="ttdeci">size_t m_dyn_low_lvl_max_packet_size</div><div class="ttdoc">Any incoming low-level (UDP) packet will be truncated to this size.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00553">options.hpp:553</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_a99cb19cf77ac787103ac616f4415eaf9"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#a99cb19cf77ac787103ac616f4415eaf9">flow::net_flow::Node_options::m_dyn_max_packets_per_main_loop_iteration</a></div><div class="ttdeci">unsigned int m_dyn_max_packets_per_main_loop_iteration</div><div class="ttdoc">The UDP net-stack may deliver 2 or more datagrams to the Flow Node at the same time.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00545">options.hpp:545</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_aa27ce9852b67581b0171b716289bea60"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#aa27ce9852b67581b0171b716289bea60">flow::net_flow::Node_options::add_config_option</a></div><div class="ttdeci">static void add_config_option(Options_description *opts_desc, const std::string &amp;opt_id, Opt_type *target_val, const Opt_type &amp;default_val, const char *description, bool printout_only)</div><div class="ttdoc">A helper that adds a single option to a given Options_description, for use either in printing out the...</div><div class="ttdef"><b>Definition:</b> <a href="options_8cpp_source.html#l00061">options.cpp:61</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_aacfe6175ac39447c107413853e578459"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#aacfe6175ac39447c107413853e578459">flow::net_flow::Node_options::opt_id_to_str</a></div><div class="ttdeci">static std::string opt_id_to_str(const std::string &amp;opt_id)</div><div class="ttdoc">Helper that, for a given option m_blah, takes something like &quot;m_blah_blah&quot; and returns the similar mo...</div><div class="ttdef"><b>Definition:</b> <a href="options_8cpp_source.html#l00160">options.cpp:160</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_abef8889be34024b07eff3211a3213d5f"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#abef8889be34024b07eff3211a3213d5f">flow::net_flow::Node_options::m_st_timer_min_period</a></div><div class="ttdeci">Fine_duration m_st_timer_min_period</div><div class="ttdoc">A time period such that the boost.asio timer implementation for this platform is able to accurately a...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00534">options.hpp:534</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_ad041b807fddff912fd6f302abeb88a2f"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#ad041b807fddff912fd6f302abeb88a2f">flow::net_flow::Node_options::m_dyn_guarantee_one_low_lvl_in_buf_per_socket</a></div><div class="ttdeci">bool m_dyn_guarantee_one_low_lvl_in_buf_per_socket</div><div class="ttdoc">This very inside-baseball setting controls the allocation/copy behavior of the UDP receive-deserializ...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00568">options.hpp:568</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_aea7861f3c7739f8e588293d16a2de447"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#aea7861f3c7739f8e588293d16a2de447">flow::net_flow::Node_options::m_st_capture_interrupt_signals_internally</a></div><div class="ttdeci">bool m_st_capture_interrupt_signals_internally</div><div class="ttdoc">If and only if this is true, the Node will detect SIGINT and SIGTERM (or your OS's version thereof); ...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00517">options.hpp:517</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Node__options_html_af93781c0e8136a82e41080701719d996"><div class="ttname"><a href="structflow_1_1net__flow_1_1Node__options.html#af93781c0e8136a82e41080701719d996">flow::net_flow::Node_options::Options_description</a></div><div class="ttdeci">Peer_socket_options::Options_description Options_description</div><div class="ttdoc">Short-hand for boost.program_options config options description. See setup_config_parsing().</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00453">options.hpp:453</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html">flow::net_flow::Peer_socket_options</a></div><div class="ttdoc">A set of low-level options affecting a single Peer_socket.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00035">options.hpp:36</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a02afb5ed4201d83c87a3a30fcbdda489"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a02afb5ed4201d83c87a3a30fcbdda489">flow::net_flow::Peer_socket_options::m_st_init_drop_timeout</a></div><div class="ttdeci">Fine_duration m_st_init_drop_timeout</div><div class="ttdoc">Once socket enters ESTABLISHED state, this is the value for Peer_socket::m_snd_drop_timeout until the...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00226">options.hpp:226</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a0b37da87848d01220c7e58f90e6764ba"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a0b37da87848d01220c7e58f90e6764ba">flow::net_flow::Peer_socket_options::m_st_max_rexmissions_per_packet</a></div><div class="ttdeci">unsigned int m_st_max_rexmissions_per_packet</div><div class="ttdoc">If retransmission is enabled and a given packet is retransmitted this many times and has to be retran...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00220">options.hpp:220</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a171480324f26432928738532cb3c8556"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a171480324f26432928738532cb3c8556">flow::net_flow::Peer_socket_options::m_st_rcv_buf_max_size</a></div><div class="ttdeci">size_t m_st_rcv_buf_max_size</div><div class="ttdoc">Maximum number of bytes that the Receive buffer can hold.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00141">options.hpp:141</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a1bdc21e84373dd96494a76f11603335e"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a1bdc21e84373dd96494a76f11603335e">flow::net_flow::Peer_socket_options::m_st_cong_ctl_max_cong_wnd_blocks</a></div><div class="ttdeci">size_t m_st_cong_ctl_max_cong_wnd_blocks</div><div class="ttdoc">The constant that determines the CWND limit in Congestion_control_classic_data::congestion_window_at_...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00296">options.hpp:296</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a2a3d420992e19e5addb7193d607e82e4"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a2a3d420992e19e5addb7193d607e82e4">flow::net_flow::Peer_socket_options::m_st_snd_bandwidth_est_sample_period_floor</a></div><div class="ttdeci">Fine_duration m_st_snd_bandwidth_est_sample_period_floor</div><div class="ttdoc">When estimating the available send bandwidth, each sample must be compiled over at least this long of...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00267">options.hpp:267</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a2a7ab1e27acd52d8fa3aadc9eb13d116"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a2a7ab1e27acd52d8fa3aadc9eb13d116">flow::net_flow::Peer_socket_options::m_st_cong_ctl_cong_avoidance_increment_blocks</a></div><div class="ttdeci">unsigned int m_st_cong_ctl_cong_avoidance_increment_blocks</div><div class="ttdoc">The multiple of max-block-size by which to increment CWND in congestion avoidance mode after receivin...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00306">options.hpp:306</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a2c8fcb08dfb0d1ebcc21e02940c149e8"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a2c8fcb08dfb0d1ebcc21e02940c149e8">flow::net_flow::Peer_socket_options::m_st_cong_ctl_cong_wnd_on_drop_timeout_blocks</a></div><div class="ttdeci">size_t m_st_cong_ctl_cong_wnd_on_drop_timeout_blocks</div><div class="ttdoc">On Drop Timeout, set congestion window to this value times max-block-size.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00299">options.hpp:299</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a371e3340cecf792f0fd815b55dd25f60"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a371e3340cecf792f0fd815b55dd25f60">flow::net_flow::Peer_socket_options::m_dyn_rcv_wnd_recovery_max_period</a></div><div class="ttdeci">Fine_duration m_dyn_rcv_wnd_recovery_max_period</div><div class="ttdoc">Approximate amount of time since the beginning of rcv_wnd recovery due to rcv-buf-max-size-to-adverti...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00339">options.hpp:339</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a42ce94dbc5d8be28134261c2eb18b245"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a42ce94dbc5d8be28134261c2eb18b245">flow::net_flow::Peer_socket_options::Congestion_control_strategy_choice</a></div><div class="ttdeci">Congestion_control_strategy_choice</div><div class="ttdoc">The possible choices for congestion control strategy for the socket.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00062">options.hpp:63</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a637811d19d4a2b4d9b3ab79742aadff8"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a637811d19d4a2b4d9b3ab79742aadff8">flow::net_flow::Peer_socket_options::m_st_cong_ctl_init_cong_wnd_blocks</a></div><div class="ttdeci">size_t m_st_cong_ctl_init_cong_wnd_blocks</div><div class="ttdoc">The initial size of the congestion window, given in units of max-block-size-sized blocks.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00277">options.hpp:277</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a638ca4ecd9d8bfc8710bda71687c4ea3"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a638ca4ecd9d8bfc8710bda71687c4ea3">flow::net_flow::Peer_socket_options::m_st_drop_packet_exactly_after_drop_timeout</a></div><div class="ttdeci">bool m_st_drop_packet_exactly_after_drop_timeout</div><div class="ttdoc">If true, when scheduling Drop Timer, schedule it for Drop Timeout relative to the send time of the ea...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00233">options.hpp:233</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a6c35e6014182ccfcbee6bed4571a8360"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a6c35e6014182ccfcbee6bed4571a8360">flow::net_flow::Peer_socket_options::m_st_rexmit_on</a></div><div class="ttdeci">bool m_st_rexmit_on</div><div class="ttdoc">Whether to enable reliability via retransmission.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00214">options.hpp:214</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a8ca6086022691700f5e5d2dc87ca92fd"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a8ca6086022691700f5e5d2dc87ca92fd">flow::net_flow::Peer_socket_options::m_st_snd_buf_max_size</a></div><div class="ttdeci">size_t m_st_snd_buf_max_size</div><div class="ttdoc">Maximum number of bytes that the Send buffer can hold.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00134">options.hpp:134</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_a8f18c8222ade5f99b83a85e0203ff130"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#a8f18c8222ade5f99b83a85e0203ff130">flow::net_flow::Peer_socket_options::m_st_connect_retransmit_period</a></div><div class="ttdeci">Fine_duration m_st_connect_retransmit_period</div><div class="ttdoc">How often to resend SYN or SYN_ACK while SYN_ACK or SYN_ACK_ACK, respectively, has not been received.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00121">options.hpp:121</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_aa6d16c98186187fdffadcfb853d58410"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#aa6d16c98186187fdffadcfb853d58410">flow::net_flow::Peer_socket_options::m_st_rcv_buf_max_size_slack_percent</a></div><div class="ttdeci">unsigned int m_st_rcv_buf_max_size_slack_percent</div><div class="ttdoc">% of rcv-buf-max-size such that if Receive buffer stores up to (100 + this many) % of rcv-buf-max-siz...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00160">options.hpp:160</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_aa6d94acf3c746c8f59c91ffa824ef8bd"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#aa6d94acf3c746c8f59c91ffa824ef8bd">flow::net_flow::Peer_socket_options::setup_config_parsing</a></div><div class="ttdeci">void setup_config_parsing(Options_description *opts_desc)</div><div class="ttdoc">Analogous to Node_options::setup_config_parsing().</div><div class="ttdef"><b>Definition:</b> <a href="options_8cpp_source.html#l00478">options.cpp:478</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ac31b91c6f8c7b0d7a4e29fd218e5f9dc"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ac31b91c6f8c7b0d7a4e29fd218e5f9dc">flow::net_flow::Peer_socket_options::Peer_socket_options</a></div><div class="ttdeci">Peer_socket_options()</div><div class="ttdoc">Constructs a Peer_socket_options with values equal to those used by Node when the Node creator choose...</div><div class="ttdef"><b>Definition:</b> <a href="options_8cpp_source.html#l00184">options.cpp:184</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ac38c0bbba5edbb4964a3914ccf56018f"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ac38c0bbba5edbb4964a3914ccf56018f">flow::net_flow::Peer_socket_options::m_dyn_rcv_wnd_recovery_timer_period</a></div><div class="ttdeci">Fine_duration m_dyn_rcv_wnd_recovery_timer_period</div><div class="ttdoc">When the mode triggered by rcv-buf-max-size-to-advertise-percent being exceeded is in effect,...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00333">options.hpp:333</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ac6f4da1892e2157e60772ed74298b2b2"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ac6f4da1892e2157e60772ed74298b2b2">flow::net_flow::Peer_socket_options::m_st_drop_all_on_drop_timeout</a></div><div class="ttdeci">bool m_st_drop_all_on_drop_timeout</div><div class="ttdoc">If true, when the Drop Timer fires, all In-flight packets are to be considered Dropped (and thus the ...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00240">options.hpp:240</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ac75171c4f1086d0aa38248ae5ffba884"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ac75171c4f1086d0aa38248ae5ffba884">flow::net_flow::Peer_socket_options::m_st_connect_retransmit_timeout</a></div><div class="ttdeci">Fine_duration m_st_connect_retransmit_timeout</div><div class="ttdoc">How long from the first SYN or SYN_ACK to allow for connection handshake before aborting connection.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00124">options.hpp:124</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_aca69056d3029193823f0c0ae630f5759"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#aca69056d3029193823f0c0ae630f5759">flow::net_flow::Peer_socket_options::m_st_cong_ctl_strategy</a></div><div class="ttdeci">Congestion_control_strategy_choice m_st_cong_ctl_strategy</div><div class="ttdoc">The congestion control algorithm to use for the connection or connections.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00270">options.hpp:270</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ad0015d953f3079a326ba6dce5d0bff89"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad0015d953f3079a326ba6dce5d0bff89">flow::net_flow::Peer_socket_options::setup_config_parsing_helper</a></div><div class="ttdeci">static void setup_config_parsing_helper(Options_description *opts_desc, Peer_socket_options *target, const Peer_socket_options &amp;defaults_source, bool printout_only)</div><div class="ttdoc">Analogous to Node_options::setup_config_parsing_helper().</div><div class="ttdef"><b>Definition:</b> <a href="options_8cpp_source.html#l00271">options.cpp:271</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ad65db0c4fdf22bf5723dc3018174b4aa"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad65db0c4fdf22bf5723dc3018174b4aa">flow::net_flow::Peer_socket_options::Options_description</a></div><div class="ttdeci">boost::program_options::options_description Options_description</div><div class="ttdoc">Short-hand for boost.program_options config options description. See setup_config_parsing().</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00040">options.hpp:40</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ad7a76f7ae03e258b30b04c7350481de6"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad7a76f7ae03e258b30b04c7350481de6">flow::net_flow::Peer_socket_options::m_st_max_full_blocks_before_ack_send</a></div><div class="ttdeci">size_t m_st_max_full_blocks_before_ack_send</div><div class="ttdoc">If there are at least this many TIMES max-block-size bytes' worth of individual acknowledgments to be...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00198">options.hpp:198</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ad7cbcdd64a4366740ff9e55b39c977ba"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad7cbcdd64a4366740ff9e55b39c977ba">flow::net_flow::Peer_socket_options::m_st_snd_pacing_enabled</a></div><div class="ttdeci">bool m_st_snd_pacing_enabled</div><div class="ttdoc">Enables or disables packet pacing, which attempts to spread out, without sacrificing overall send thr...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00258">options.hpp:258</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ad9a31f63eea6f89952a89ea0385d9a2e"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ad9a31f63eea6f89952a89ea0385d9a2e">flow::net_flow::Peer_socket_options::m_st_rcv_flow_control_on</a></div><div class="ttdeci">bool m_st_rcv_flow_control_on</div><div class="ttdoc">Whether flow control (a/k/a receive window a/k/a rcv_wnd management) is enabled.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00150">options.hpp:150</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_add7ccb9e8cd0715ca78e0710d2a6db06"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#add7ccb9e8cd0715ca78e0710d2a6db06">flow::net_flow::Peer_socket_options::m_st_delayed_ack_timer_period</a></div><div class="ttdeci">Fine_duration m_st_delayed_ack_timer_period</div><div class="ttdoc">The maximum amount of time to delay sending ACK with individual packet's acknowledgment since receivi...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00191">options.hpp:191</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ae2551f2995f5830e0461bec6fdd9035e"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ae2551f2995f5830e0461bec6fdd9035e">flow::net_flow::Peer_socket_options::m_dyn_drop_timeout_backoff_factor</a></div><div class="ttdeci">unsigned int m_dyn_drop_timeout_backoff_factor</div><div class="ttdoc">Whenever the Drop Timer fires, upon the requisite Dropping of packet(s), the DTO (Drop Timeout) is se...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00325">options.hpp:325</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_ae7d5eb1b4e37317478c3b25bc3c8c245"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#ae7d5eb1b4e37317478c3b25bc3c8c245">flow::net_flow::Peer_socket_options::m_st_out_of_order_ack_restarts_drop_timer</a></div><div class="ttdeci">bool m_st_out_of_order_ack_restarts_drop_timer</div><div class="ttdoc">If an In-flight packet is acknowledged, but it is not the earliest In-flight packet (i....</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00248">options.hpp:248</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_aeaaf832a38a5e334789e81e214686ea7"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#aeaaf832a38a5e334789e81e214686ea7">flow::net_flow::Peer_socket_options::m_st_max_block_size</a></div><div class="ttdeci">size_t m_st_max_block_size</div><div class="ttdoc">The size of block that we will strive to (and will, assuming at least that many bytes are available i...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00114">options.hpp:114</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_aeccfe97128c9f5f62ff26d73047dec2e"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#aeccfe97128c9f5f62ff26d73047dec2e">flow::net_flow::Peer_socket_options::m_st_cong_ctl_classic_wnd_decay_percent</a></div><div class="ttdeci">unsigned int m_st_cong_ctl_classic_wnd_decay_percent</div><div class="ttdoc">In classic congestion control, RFC 5681 specifies the window should be halved on loss; this option al...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00314">options.hpp:314</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_af483d0292f363e7dbf14dc7a2dd49f3f"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#af483d0292f363e7dbf14dc7a2dd49f3f">flow::net_flow::Peer_socket_options::m_st_rcv_buf_max_size_to_advertise_percent</a></div><div class="ttdeci">unsigned int m_st_rcv_buf_max_size_to_advertise_percent</div><div class="ttdoc">% of rcv-buf-max-size that has to be freed, since the last receive window advertisement,...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00171">options.hpp:171</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_af78ca6cf3c6da3bc24cea40d522f0bdb"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#af78ca6cf3c6da3bc24cea40d522f0bdb">flow::net_flow::Peer_socket_options::m_st_rcv_max_packets_after_unrecvd_packet_ratio_percent</a></div><div class="ttdeci">unsigned int m_st_rcv_max_packets_after_unrecvd_packet_ratio_percent</div><div class="ttdoc">The limit on the size of Peer_socket::m_rcv_packets_with_gaps, expressed as what percentage the maxim...</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00183">options.hpp:183</a></div></div>
<div class="ttc" id="astructflow_1_1net__flow_1_1Peer__socket__options_html_afd02a9d91ef5e5c13ea95ea35624da1a"><div class="ttname"><a href="structflow_1_1net__flow_1_1Peer__socket__options.html#afd02a9d91ef5e5c13ea95ea35624da1a">flow::net_flow::Peer_socket_options::m_dyn_drop_timeout_ceiling</a></div><div class="ttdeci">Fine_duration m_dyn_drop_timeout_ceiling</div><div class="ttdoc">Ceiling to impose on the Drop Timeout.</div><div class="ttdef"><b>Definition:</b> <a href="options_8hpp_source.html#l00317">options.hpp:317</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Fri Mar 28 2025 22:55:35 for Flow by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.4
</small></address>
</body>
</html>
